package tournoi.modele;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.*;

/**
 * Classe definissant un tournoi. Un tournoi sera un objet qui aura pour
 * attribut un id. L'id sera genere automatiquement. Il contiendra la liste de
 * ses tours, ainsi qu'une reference vers son tour en cours
 * 
 * @author Florent Champigny, Kevin De Jesus Ferreira and Julien Mialon
 * 
 */
@Entity
public class Tournoi implements Serializable {

	private static final long serialVersionUID = 483479387631209843L;

	/**
	 * Id du tournoi
	 */
	@Id
	@GeneratedValue
	private int id;

	/**
	 * Collection de tous les tours du tournoi triés par numero du tour
	 */
	@OneToMany(fetch = FetchType.EAGER)
	@OrderBy("numero DESC")
	private Set<Tour> tours;

	/**
	 * Numero du tours qui est en cours
	 */
	private int tourEnCours;

	/**
	 * Dernier match du tournoi ne contenant que en domicile l'equipe gagnante
	 */
	@OneToOne
	private Match gagnant;

	// ########### Affichage ######################

	/**
	 * 
	 * Permet à partir d'un nombre de tour et du match racine d'afficher le
	 * tournoi en forme d'arbre.
	 * 
	 * @param match
	 *            - Match considéré comme la racine du tournoi, le plus souvent
	 *            la finale
	 * @param tour
	 *            - Nombre de tours du tournoi
	 * @return - Le tournoi sous forme d'arbre
	 */
	private String afficherMatchNode(Match match, int tour) {
		StringBuffer sb = new StringBuffer();

		// le match
		sb.append("<ul ").append("match=\"").append(match.getId())
				.append("\" ").append("tour=\"").append(tour).append("\" ")
				.append(">").append("\n");

		sb.append("<li>"); // equipe domicile
		if (match.getDomicile() != null) {
			sb.append("<a href=\"index?action=equipe&id=")
					.append(match.getDomicile().getId())
					.append("\">" + match.getDomicile().getNom())
					.append("</a>");
			if (match.isFinit()) {
				if (match.isTirAuButs()) {
					sb.append(
							"<br/>"
									+ (match.scoreEquipe(match.getDomicile()) - match
											.scoreEquipeTirAuBut(match
													.getDomicile()))).append(
							"<br/> ("
									+ match.scoreEquipeTirAuBut(match
											.getDomicile()) + ")");
				} else {
					sb.append("<br/>" + match.scoreEquipe(match.getDomicile()));
				}
			}
		}
		// else
		// s += "Domicile";

		if (match.getAncienMatchDomicile() != null) {
			sb.append("\n");
			sb.append(afficherMatchNode(match.getAncienMatchDomicile(),
					tour + 1));
			sb.append("\n");
		}
		sb.append("</li>"); // equipe domicile
		sb.append("\n");

		if (tour >= 1) {
			sb.append("<li>"); // equipe exterieure
			if (match.getExterieur() != null) {
				sb.append("<a href=\"index?action=equipe&id=")
						.append(match.getExterieur().getId()).append("\">")
						.append(match.getExterieur().getNom()).append("</a>");
				if (match.isFinit()) {
					if (match.isTirAuButs()) {
						sb.append(
								"<br/>"
										+ (match.scoreEquipe(match
												.getExterieur()) - match
												.scoreEquipeTirAuBut(match
														.getExterieur())))
								.append("<br/> ("
										+ match.scoreEquipeTirAuBut(match
												.getExterieur()) + ")");
					} else {
						sb.append("<br/>"
								+ match.scoreEquipe(match.getExterieur()));
					}
				}
			}
			// else
			// s += "Exterieur";

			if (match.getAncienMatchExterieur() != null) {
				sb.append("\n");
				sb.append(afficherMatchNode(match.getAncienMatchExterieur(),
						tour + 1));
				sb.append("\n");
			}
			sb.append("</li>"); // equipe exterieure
		}

		sb.append("</ul>"); // les equipes du match
		sb.append("\n");

		return sb.toString();
	}

	/**
	 * Permet d'afficher le tournoi sous la forme d'arbre
	 * 
	 * @return - Le tournoi sous la forme d'arbre
	 */
	public String afficherArbre() {
		if (gagnant != null) {
			return (afficherMatchNode(gagnant, 0));
		} else
			return "vide";
	}

	// ########### Getters and Setters ############

	public int getId() {
		return id;
	}

	public Match getGagnant() {
		return gagnant;
	}

	public void setGagnant(Match gagnant) {
		this.gagnant = gagnant;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Set<Tour> getTours() {
		return tours;
	}

	public void setTours(Set<Tour> tours) {
		this.tours = tours;
	}

	public int getTourEnCours() {
		return tourEnCours;
	}

	public void setTourEnCours(int tourEnCours) {
		this.tourEnCours = tourEnCours;
	}
}
